package cn.liit.weixin.jspay.support;

import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import name.zbq.bush.utils.DateUtil;
import name.zbq.bush.utils.RandomStringGenerator;
import name.zbq.bush.utils.UnitUtil;
import name.zbq.bush.utils.http.HttpConnect;
import cn.liit.weixin.core.config.Config;
import cn.liit.weixin.core.utils.Signature;
import cn.liit.weixin.jspay.model.WxPayDto;

import com.alibaba.fastjson.JSONObject;

public class JsPaySupport {
	private static final String APIURL_PLACEORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
	/**
	 * @param args
	 */
	public static void main(String[] args) {
	}
	
	/**
	 * 调用微信统一下单接口进行下单
	 * @param tpWxPayDto 下单参数
	 * @return 统一下单的响应信息
	 */
	public static Map<String,String> placeOrder(WxPayDto tpWxPayDto){
		String prepay_id="";
		String nonce_str = RandomStringGenerator.getNonceStr();
		//----------------------------签名参数
		SortedMap<String, String> params = new TreeMap<String, String>();
		params.put("appid", Config.appid);//公共号appid
		params.put("mch_id", Config.partner);//商户号
		params.put("nonce_str", nonce_str);//随机字符串
		params.put("body", tpWxPayDto.getBody());//商品或支付单简要描述
		params.put("attach", tpWxPayDto.getAttach());//附加数据 在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
		params.put("out_trade_no", tpWxPayDto.getOrderId());//商户订单号
		params.put("total_fee", UnitUtil.getMoney(tpWxPayDto.getTotalFee()));//总金额 单位为分 getMoney把元转成分
		params.put("spbill_create_ip", tpWxPayDto.getSpbillCreateIp());//用户端ip
		params.put("notify_url", Config.notifyurl);//异步通知回调地址
		params.put("trade_type", "JSAPI");//交易类型
		params.put("openid", tpWxPayDto.getOpenId());//用于在商户appid下的唯一标识
		
		String sign = Signature.createSign(params);//生成数据签名
		
		//-----------------------------请求参数(加上数据签名)
		params.put("sign", sign);
		//-----------------------------获取预支付订单
		Map<String,String> result = HttpConnect.getInstance().doPostXml(APIURL_PLACEORDER, params);
		return result;
	}
	/**
	 * 获取预支付交易会话标识
	 * @param 下单参数 dto
	 * @return 返回预支付交易会话标识
	 */
	public static String getOrderPrepayId(WxPayDto wxPayDto){
		Map<String,String> result = placeOrder(wxPayDto);
		return result.get("prepay_id");
	}
	
	/**
	 * 获取jsapi支付所需options（包括package）
	 * @param prepayId 预支付交易会话标识
	 * @return jsapi支付所需options
	 */
	public static String getPayPackage(String prepayId){
		//获取prepay_id后，拼接最后请求支付所需要的package
		String packages = "prepay_id="+prepayId;
		String timestamp = DateUtil.getTimeStamp();
		String nonceStr = RandomStringGenerator.getNonceStr();
		SortedMap<String, String> params = new TreeMap<String, String>();
		params.put("appId", Config.appid);
		params.put("timeStamp", timestamp);
		params.put("nonceStr", nonceStr);
		params.put("package", packages);
		params.put("signType", "MD5");
		//------------------------数据签名
		String sign = Signature.createSign(params);
		params.put("paySign", sign);
		//------------------------转换为json字符串
		String options =  JSONObject.toJSONString(params);
		return options;
	}

	/**
	 * 生成微信支付所需options
	 * @param wxPayDto
	 * @return
	 */
	public static String getPayPackage(WxPayDto wxPayDto){
		String prepayId = getOrderPrepayId(wxPayDto);
		return getPayPackage(prepayId);
	}
}
